package com.ruibang.glass.portal.util;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.lang.StringUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;


/**
 * MD5加密
 */
public class Encrypt {

	/**
	 * 密码加密
	 *（固定长度32位，=MD5(salt+md5(md5(inputPwd)))）
	 * @param plainText
	 * @param salt
	 * @return
	 */
	public static String encrypt(String plainText, String salt) {
		return MD5(salt + MD5(MD5(plainText)));
	}

	
	/**
	 * uuid加密为盐值
	 * 盐值（固定长度32位，每个用户使用不同的盐值=MD5(SecureRandom())）
	 * @return
	 */
	public static String getSalt() {
		String salt = UUID.randomUUID().toString().replaceAll("-", "");
		return MD5(salt);
	}
	
	/**
	 * @param plainText
	 * @return
	 */
	public static String MD5(String plainText) {
		StringBuffer buf = new StringBuffer();
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(plainText.getBytes());
			byte b[] = md.digest();
			int i;
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
		} catch (NoSuchAlgorithmException e) {
		}
		return buf.toString();
	}

	/**
	 * 比较密码是否相等
	 * @param source 源密码，数据中的密码
	 * @param target 目标密码明文
	 * @param salt 盐值
	 * @return
	 */
	public static boolean isEquals(String source,String target,String salt){
		boolean flag = false;
		if(StringUtils.equals(source, encryPwd(salt, target))){
			flag = true;
		}
		return flag;
	}
	
	/**
	 * 比较密码是否相等
	 * @param source 源密码，数据中的密码
	 * @param target 目标加密密码
	 * @param salt 盐值
	 * @return
	 */
	/*public static boolean isEqualsMd5Target(String source,String target,String salt){
		boolean flag = false;
		if(StringUtils.equals(source,MD5(salt+MD5(target)))){
			flag = true;
		}
		return flag;
	}*/
	
	/**
	 * 加密加密密码
	 * @param salt
	 * @param password
	 * @return
	 */
	public static String encryPwd(String salt,String password){
		return MD5(salt+MD5(password));
	}
	
	public static void main(String[] args) {
		//获取盐值
		//String salt = Encrypt.getSalt();
		//明文加密生产密码
		//String password = Encrypt.encryPwd(salt, "123456");
		//System.out.println(isEquals("23e699888dd094e835237441d3643c78", "123456", "cc5f0c47a57ca2cb319403658f386014"));
		System.out.println(base64Encode("LTAI4FnGDVFQrc99tyKMgQ2z"));
		System.out.println(base64Encode("9BJ6M0BPAImrCDIhC8JOTZSvg6ZsRS"));
		System.out.println(base64Decode("TFRBSTRGbkdEVkZRcmM5OXR5S01nUTJ6"));
		System.out.println(base64Decode("OUJKNk0wQlBBSW1yQ0RJaEM4Sk9UWlN2ZzZac1JT"));
	}

	/***
	 * 使用Base64进行加密
	 * @param res
	 * @return
	 */
	public static String base64Encode(String res) {
		return Base64.encode(res.getBytes());
	}

	/**
	 * 使用Base64进行解密
	 * @param res
	 * @return
	 */
	public static String base64Decode(String res) {
		return new String(Base64.decode(res));
	}
}
